#include "main.h"

/*******************************************************************************

	˵����
		��̬�������ʾ0-7
	���أ�STM32F103C8T6	
	���ţ�
		PB8		a
		PB9		b
		PB10	c
		PB11	d
		PB12	e
		PB13	f
		PB14	g
		PB15	dp
		
	ע��
		��Ҫ��ʾdp�ģ����������λ��0�����������λ��1
********************************************************************************/
/*
12 11 10 9 8 7 
1  2  3  4 5 6


*******************
11 7 4 2 1 10 5 3
A  B C D E F  D DP

6-8-9-12--VCC/GND
*******************

//接线
PB-8  9 10 11 12 13 14 15
   11 7 4  2  1  10 5  3
   
PA-0  1 2 3
   12 9 8 6 
*/
// 数码管段选引脚的定义（根据您的连接）
#define SEG_A GPIO_Pin_8
#define SEG_B GPIO_Pin_9
#define SEG_C GPIO_Pin_10
#define SEG_D GPIO_Pin_11
#define SEG_E GPIO_Pin_12
#define SEG_F GPIO_Pin_13
#define SEG_G GPIO_Pin_14
#define SEG_DP GPIO_Pin_15
 
// 数码管位选引脚的定义（根据您的连接）
#define DIGIT_A GPIO_Pin_0
#define DIGIT_B GPIO_Pin_1
#define DIGIT_C GPIO_Pin_2
#define DIGIT_D GPIO_Pin_3

#if 0
//共阴数码管
static uint8_t num[11] = {
    //dp g f e d c b a
    0x3F, // 0: 00111111
    0x06, // 1: 00000110
    0x5B, // 2: 01011011
    0x4F, // 3: 01001111
    0x66, // 4: 01100110
    0x6D, // 5: 01101101
    0x7D, // 6: 01111101
    0x07, // 7: 00000111
    0x7F, // 8: 01111111
    0x6F  // 9: 01101111
	0x80, // .: 10000000
};
#else
//共阳数码管
static uint8_t num[] = {0xc0, 0xf9,0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,0x80, 0x90, 0x7F}; 
#endif


// 设置数码管显示的数字
void DisplayDigit(uint8_t digit, uint8_t pos)
{
    uint8_t segments = num[digit];

    // 根据数字设置相应的段引脚状态
    GPIO_WriteBit(GPIOB, SEG_A, (segments & 0x01) ? Bit_SET : Bit_RESET);
    GPIO_WriteBit(GPIOB, SEG_B, (segments & 0x02) ? Bit_SET : Bit_RESET);
    GPIO_WriteBit(GPIOB, SEG_C, (segments & 0x04) ? Bit_SET : Bit_RESET);
    GPIO_WriteBit(GPIOB, SEG_D, (segments & 0x08) ? Bit_SET : Bit_RESET);
    GPIO_WriteBit(GPIOB, SEG_E, (segments & 0x10) ? Bit_SET : Bit_RESET);
    GPIO_WriteBit(GPIOB, SEG_F, (segments & 0x20) ? Bit_SET : Bit_RESET);
    GPIO_WriteBit(GPIOB, SEG_G, (segments & 0x40) ? Bit_SET : Bit_RESET);
	GPIO_WriteBit(GPIOB, SEG_DP, (segments & 0x80) ? Bit_SET : Bit_RESET);

    // 关闭所有位显示
    GPIO_WriteBit(GPIOA, DIGIT_A, Bit_RESET);
    GPIO_WriteBit(GPIOA, DIGIT_B, Bit_RESET);
    GPIO_WriteBit(GPIOA, DIGIT_C, Bit_RESET);
    GPIO_WriteBit(GPIOA, DIGIT_D, Bit_RESET);

    // 激活当前位
    switch (pos) 
	{
        case 1: GPIO_WriteBit(GPIOA, DIGIT_A, Bit_SET); break;
        case 2: GPIO_WriteBit(GPIOA, DIGIT_B, Bit_SET); break;
        case 3: GPIO_WriteBit(GPIOA, DIGIT_C, Bit_SET); break;
        case 4: GPIO_WriteBit(GPIOA, DIGIT_D, Bit_SET); break;
    }
}

int main(void)
{
	int i = 0;
	int count = 0;
	Init_74HC138_Pin();
	Digital_Tube_Pin_Init();
	Sys_Delay_Init();
	Usart1_Pin_Init(115200);
	printf("��ʼ���ɹ�\r\n");
	
	
	#if 1
	
	// 主循环
    while (1)
    {
        while(count < 10)
		{
			DisplayDigit(count, count % 4 +1); // 显示1在第一位
			delay_ms(500);   // 延时
			count++;
		}
		count = 0;

		
		while(count < 500)
		{
			DisplayDigit(1, 1); // 显示1在第一位
			delay_ms(2);   // 延时
			DisplayDigit(2, 2); // 显示2在第二位
			delay_ms(2);  
			DisplayDigit(3, 3); // 显示3在第三位
			delay_ms(2);  
			DisplayDigit(4, 4); // 显示4在第四位
			delay_ms(2); 
			count+=8;
		}
		count = 0;
		
		while(count < 500)
		{
			DisplayDigit(10, 1); // 显示1在第一位
			delay_ms(2);   // 延时
			DisplayDigit(10, 2); // 显示2在第二位
			delay_ms(2);  
			DisplayDigit(10, 3); // 显示3在第三位
			delay_ms(2);  
			DisplayDigit(10, 4); // 显示4在第四位
			delay_ms(2); 
			count+=8;
		}
		count = 0;
		
    }
	
	return 0;
	#endif
	
	while(1)
	{	
		for (i = 0; i < 8;i++) {
			Control_Tube_Display(i);
			Digital_Tube_Display(GPIOB,segment_map[i]);
			delay_ms(2);
			
			i %= 10;
		}
		
	}
}
